package com.dyna.auth.service;

import com.dyna.api.domain.entity.SysOAuth2AccessToken;
import com.dyna.api.domain.resp.AuthLoginResp;
import com.dyna.api.domain.resp.SysOAuth2AccessTokenCheckResp;
import com.dyna.domain.resp.R;

import java.util.List;

/**
 * @author zhoucaiwang
 * @date 2023/8/15
 */
public interface TokenService {

    /**
     * 创建访问令牌
     * @param userId 用户id
     * @param clientIdDefault 客户端id
     * @param scopes 登录信息
     * @return AuthLoginResp
     */
    AuthLoginResp createAccessToken(Long userId, String clientIdDefault, List<String> scopes);

    /**
     * 刷新访问令牌
     *
     * 参考 DefaultTokenServices 的 refreshAccessToken 方法
     *
     * @param refreshToken 刷新令牌
     * @param clientId 客户端编号
     * @return 访问令牌的信息
     */
    AuthLoginResp refreshAccessToken(String refreshToken, String clientId);

    /**
     * 验证访问令牌
     * @param accessToken 访问令牌
     * @return R<SysOAuth2AccessTokenCheckResp>
     */
    R<SysOAuth2AccessTokenCheckResp> checkAccessToken(String accessToken);

    /**
     * 获得访问令牌
     * 参考 DefaultTokenServices 的 getAccessToken 方法
     *
     * @param accessToken 访问令牌
     * @return 访问令牌的信息
     */
    SysOAuth2AccessToken getAccessToken(String accessToken);

    /**
     * 移除访问令牌
     * 注意：该流程中，会移除相关的刷新令牌
     *
     * 参考 DefaultTokenServices 的 revokeToken 方法
     *
     * @param accessToken 刷新令牌
     * @return 访问令牌的信息
     */
    SysOAuth2AccessToken removeAccessToken(String accessToken);

}
